<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Compilador de Pascal :: PLg 2007-2008 </title>

<link href="style.css" rel="stylesheet" type="text/css" />
<!--[if IE 6]>
  <style>
  /*<![CDATA[*/
#sidebarbottom {background:url(images/sidebarbottom.jpg) no-repeat -3px;}
  /*]]>*/
  </style>
<![endif]-->
</head>

<body>
<div id="wrap">
<div id="topbar">
  
</div>
<div id="header">
<ul id="topmenu">
<li><a href="index.html">Inicio</a></li>
<li><a href="lexico.html">Léxico</a></li>
<li><a href="sintactico.html">Sintáctico</a></li>
<li><a href="tablaDeSimbolos.html">Tabla de símbolos</a></li>
<li class="active"><a href="gestorDeErrores.html">Gestor de errores</a></li>
<li><a href="casosDePrueba.html">Casos de Prueba</a></li>
</ul>
</div>
<div id="content">
<div id="mainpage">


<a id="Gestor de errores" name="Gestor de errores"></a>
<h2>Gestor de errores</h2>
<p>El gestor de errores incluye tres clases distintas:</p>

<ul>
<li>Errores</li>
<li>TError</li>
<li>GestorErrores</li>
</ul>

<h3>Errores</h3>	

<p>Hemos creado un tipo enumerado con los tipos b&aacute;sicos de errores:</p>
<p><i>LEXICO_ELEMENTO_YA_INSERTADO</i> --> Cuando ya se ha a&ntilde;adido un elemento con ese identificador.</p>
<p><i>LEXICO_CARACTER_NO_VALIDO</i> --> El car&aacute;cter no genera un <i>Token</i> v&aacute;lido.</p>
<p><i>LEXICO_ERROR_DE_IO</i> --> Se produce un error de Entrada/Salida.</p>
<p><i>SINTACTICO_IMPOSIBLE_EMPAREJAR_TERMINAL_CON_TOKEN</i> --> Cuando el parser no puede asociar el token de
entrada al simbolo no terminal que corresponde.</p>
<p><i>SINTACTICO_ERROR_TOKEN_DE_ENTRADA_ERRONEO</i> --> Cuando el token de entrada no coincide con el de la pila.</p>
<p><i>SINTACTICO_ERROR_PILAVACIA_ANTES_DE_TIEMPO</i> --> Cuando la pila esta vacia pero se ha llegado al final del fichero.</p>


<h3>El tipo TError</h3>
<p>El tipo <i>TError</i> contiene, en primer lugar, un par&aacute;metro del tipo enumerado Errores. Adem&aacute;s, contiene dos variables de tipo integer que guardan informaci&oacute;n de la l&iacute;nea y la columna en la que se ha registrado el error. De esta manera cada error podr&aacute; tratarse como una entidad independiente, y podr&aacute; almacenarse de manera sencilla.</p>
<p>Adem&aacute;s de los setters y getters de la l&iacute;nea, la columna y el tipo de error, la clase 
<i>TError</i> contiene un m&eacute;todo <i>toString()</i> (que hereda de <i>Object</i>) que devuelve un 
<i>String</i> con la informaci&oacute;n del error con un formato legible por el usuario.</p>
<p>Ejemplo: llamando a este m&eacute;todo con un error de tipo <i>CARACTER_NO_VALIDO
</i>en la l&iacute;nea 5, columna 17, el <i>String</i> ser&aacute;: <i>&quot;L&iacute;nea: 5 Columna: 17. CAR&Aacute;CTER NO VALIDO&quot;.</i></p>

<h3>El Gestor de errores</h3>
<p>El gestor de errores del compilador est&aacute; implementado usando una lista tipo 
<i>ArrayList</i> de elementos de <i>TError</i> (<i>ArrayList&lt;TError&gt;</i><TError>).</p>
<p>El gestor de errores se comunica por el resto de bloques por una sencilla interfaz. Los m&eacute;todos principales son:</p>
<p><i>setErrores</i>(<i>ArrayList</i><TError><i>&lt;TError&gt;</i> errores) --> Setter que introduce el 
<i>ArrayList</i> de errores que se le introduce como par&aacute;metro como lista de errores del programa.</p>
<p><i>insertaError</i>(<i>TError</i> <i>error</i>) --> Inserta un error, que se le pasa como par&aacute;metro, en la lista de errores. Este es el m&eacute;todo principal que el resto de m&oacute;dulos usan para la tarea de la gesti&oacute;n de errores.</p>

<h3>Uso del gestor de errores</h3>
<p></p>
<ul>
<li>Lo crea al comienzo de la ejecuci&oacute;n.</li>
<li>Llama al m&eacute;todo <i>gestor.muestraListaErrores() </i>al terminar el esc&aacute;ner para mostrar por pantalla los errores registrados.</li>
<li>Cuando gestiona una excepci&oacute;n de Entrada/Salida a&ntilde;ade un nuevo error al gestor de errores.</li>
</ul>

<p>La unidad <i>Lexico.java</i>, en la funci&oacute;n <i>next_token() </i>llama tambi&eacute;n al gestor de errores cuando el aut&oacute;mata llega a un estado de error por car&aacute;cter no valido:</p>

<p><i>gestor.insertaError(new GestorDeErrores.TError(Errores.LEXICO_CARACTER_NO_VALIDO,yyline,yycolumn));</i></p>

Con respecto al analizador sintáctico, el gestor interviene a la vez que los errores del tipo SlkError. Esta clase,
como hemos comentado en otra seccion de esta documentación controla los tres errores esenciales del parser y de los
cuales nuestro gestor intenta hacerse cargo.
<br><br>
Un error de compilación muestra los valores SLK de los tokens que entran en conflicto.
Por ejemplo:<br>
<p><font color="red">
SIN :: Error: No puedo emparejar el no-terminal 2080 con el token 265.</font></p>
Un valor por debajo de 300 se refiere a un terminal definido en <i><a href="slkconstants.html">SLkConstants.java</a></i>,
mientras que un valor mayor se refiere a un no-terminal de la misma clase. Los valores
por debajo de 256 se corresponden (y se muestran) directamente con caracteres ASCII.<br>
<br>
<br>
<h3>Nota de diseño</h3>
<br><br>
Un detalle importante a destacar es que, por ahora, mantenemos tanto el scanner como el parser aislados del gestor de errores
debido a que estamos actualizando constantemente ambos componentes del compilador. Esto nos obligaria a tener que reensamblar detalladamente
todas las conexiones a dicho gestor en cada optimizacion realizada, lo que sin duda resulta un gasto innecesario de trabajo.
<br><br><br><br>
</div>

<div class="clear"></div>
</div>
<div id="footer">
Compilador de Pascal:: PLg 2007-2008</div>
<div id="credit"><a href="http://www.ramblingsoul.com">CSS Layout</a> by Rambling Soul</div></div>

</body>
</html>